package Array;

//螺旋矩阵
public class spiral_matrix_ii {
    public static void main(String[] args) {
        generateMatrix(4);
    }
    /**
     * 题目介绍：
     * 给你一个正整数 n ，生成一个包含 1 到 n2 所有元素，且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
     * 输入：n = 3
     * 输出：[    [1,2,3],
     *           [8,9,4],
     *           [7,6,5]
     * ]
     */
    //思路过程：1.遍历思想：给二维数组赋值
    //         2.
    public static int[][] generateMatrix(int n) {
        int matrix[][] = new int[n][n];

        int num=1;
        int r=0;//定义移动的行
        int c=0;//移动的列
        int round=0;//圈数
        int startX=0; //定义每一圈的起始点
        int startY=0;
        //定义为左开右闭，即不处理右边界
        int offset=1; //目的是：走下一圈时，往内圈走一格，提前结束循环
        while (round<=n/2){
            //这些for循环 前面的变量设置是：定义起始位置
            //中间的结束循环条件是：定义结束位置
            for (c = startX; c < n - offset; c++) {
                //这里不能写成matrix[startX][c] 因为每次转完一圈后，r和c都会变成该圈的起始点的位置，即：第一圈：转完后r=0，c=0；第一圈转完后 r=1，c=1
                //所以这里在填充数据时，就是得使用起始位置startX去填充位置
                matrix[startX][c]=num++;
            }
            for (r=startY;  r< n-offset; r++) {
                matrix[r][c]=num++;
            }
            for (;c>startX;c--){
                matrix[r][c]=num++;
            }
            for (;r>startY;r--){
                matrix[r][c]=num++;
            }
            //更新起始位置，由0，0--》1，1
            startX++;
            startY++;
            round++;
            offset++;
        }
        //如果n是奇数，则中间的位置应该自己填充
        if(n%2!=0){
            matrix[r][c]=num;
        }
        return matrix;
    }
}
